package com.example.dzl.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Base64;
import java.util.Date;

@Component
public class JwtTokenUtil {

    @Value("${jwt.secret:mySecretKey}")
    private String secret; // 这里存的是Base64编码的512位密钥

    @Value("${jwt.access-token.expire:3600}")
    private Long accessTokenExpire;

    @Value("${jwt.refresh-token.expire:86400}")
    private Long refreshTokenExpire;

    // 把Base64编码的密钥转换为SecretKey对象（核心修复）
    private SecretKey getSigningKey() {
        byte[] keyBytes = Base64.getDecoder().decode(secret); // 解码Base64
        return Keys.hmacShaKeyFor(keyBytes); // 生成HS512专用密钥
    }

    // 生成Access Token（使用SecretKey签名）
    public String generateAccessToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + accessTokenExpire * 1000))
                .signWith(getSigningKey(), SignatureAlgorithm.HS512) // 替换为SecretKey
                .compact();
    }

    // 生成Refresh Token（同理修改）
    public String generateRefreshToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + refreshTokenExpire * 1000))
                .signWith(getSigningKey(), SignatureAlgorithm.HS512) // 替换为SecretKey
                .compact();
    }

    // 验证Token（使用SecretKey验证）
    public boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                    .setSigningKey(getSigningKey()) // 替换为SecretKey
                    .build()
                    .parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 从Token中获取用户名（同理修改）
    public String getUsernameFromToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(getSigningKey()) // 替换为SecretKey
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    // 检查Token是否过期（同理修改）
    public boolean isTokenExpired(String token) {
        Date expiration = Jwts.parserBuilder()
                .setSigningKey(getSigningKey()) // 替换为SecretKey
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
        return expiration.before(new Date());
    }

    public static void main(String[] args) {
        // 生成512位HS512密钥并Base64编码
        String secret = Base64.getEncoder().encodeToString(Keys.secretKeyFor(io.jsonwebtoken.SignatureAlgorithm.HS512).getEncoded());
        System.out.println("合规密钥（复制到application.yml）：" + secret);
    }
}